Token ভিত্তিক Authentication, বিশেষত JWT (JSON Web Token) ব্যবহার, Spring Security এর মাধ্যমে নিরাপদ এবং কার্যকর অ্যাপ্লিকেশন তৈরি করতে সহায়ক।
Token ব্যবস্থাপনার মূল তিনটি ধাপ হলো:
- Token Generation (টোকেন তৈরি)
- Token Validation (টোকেন যাচাই)
- Token Expiration Management (টোকেনের মেয়াদ পরিচালনা)
১. Token Generation (টোকেন তৈরি)
Token তৈরি করার জন্য সাধারণত JWT ব্যবহার করা হয়। এটি একটি কমপ্যাক্ট এবং স্বাক্ষরযুক্ত স্ট্রিং যা ব্যবহারকারীর তথ্য বহন করে।
Token Structure:
JWT তিনটি অংশ নিয়ে গঠিত:
- Header:
- এলগরিদম এবং টোকেনের ধরন।
- Payload:
- ব্যবহারকারীর তথ্য যেমন
username,roles, এবং অন্যান্য ক্লেইম।
- ব্যবহারকারীর তথ্য যেমন
- Signature:
- টোকেনের অখণ্ডতা নিশ্চিত করার জন্য সিক্রেট কী দিয়ে সাইন করা হয়।
Spring Boot ব্যবহার করে JWT টোকেন তৈরি করা:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
private static final String SECRET_KEY = "mySecretKey";
private static final long EXPIRATION_TIME = 86400000; // 1 দিন
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
}
২. Token Validation (টোকেন যাচাই)
Token যাচাই করার সময় নিশ্চিত করতে হবে:
- টোকেনটি বৈধ।
- টোকেনের স্বাক্ষর সঠিক।
- টোকেন মেয়াদোত্তীর্ণ নয়।
Spring Boot ব্যবহার করে JWT যাচাই:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
public class JwtUtil {
private static final String SECRET_KEY = "mySecretKey";
public static Claims validateToken(String token) {
try {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
} catch (SignatureException e) {
throw new RuntimeException("Invalid JWT Signature");
} catch (Exception e) {
throw new RuntimeException("Invalid Token");
}
}
}
Token Validation ব্যবহার:
String token = "Bearer eyJhbGciOiJIUzI1NiIsInR...";
Claims claims = JwtUtil.validateToken(token.substring(7));
String username = claims.getSubject();
৩. Token Expiration Management (টোকেনের মেয়াদ পরিচালনা)
Token এর মেয়াদ নির্ধারণ করা নিরাপত্তার একটি গুরুত্বপূর্ণ অংশ। মেয়াদোত্তীর্ণ টোকেন গ্রহণ করা হলে এটি নিরাপত্তা ঝুঁকি তৈরি করতে পারে।
Expiration Time সেটআপ:
Token তৈরি করার সময় setExpiration ফিল্ড ব্যবহার করে মেয়াদ নির্ধারণ করা হয়।
private static final long EXPIRATION_TIME = 3600000; // 1 ঘন্টা
Expiration যাচাই:
Spring Security স্বয়ংক্রিয়ভাবে মেয়াদোত্তীর্ণ টোকেনের জন্য একটি ExpiredJwtException ছুঁড়ে দেয়। এটি যাচাই করার জন্য:
public static boolean isTokenExpired(String token) {
Claims claims = validateToken(token);
return claims.getExpiration().before(new Date());
}
Spring Security এর সাথে JWT Token Integration:
Authentication Filter:
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
if (!JwtUtil.isTokenExpired(token)) {
Claims claims = JwtUtil.validateToken(token);
String username = claims.getSubject();
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
username, null, new ArrayList<>());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
filterChain.doFilter(request, response);
}
}
Spring Security Configuration:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login", "/register").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter());
}
}
Token Refresh এবং Revocation Management:
- Token Refresh:
- মেয়াদ শেষ হওয়ার আগে নতুন টোকেন ইস্যু করার একটি পদ্ধতি।
- Spring Security এ একটি
/refreshএন্ডপয়েন্ট ব্যবহার করা যায়।
- Token Revocation:
- ব্যবহারকারীর লগআউট বা টোকেন অবৈধ করার জন্য টোকেন রোকেশন প্রয়োজন।
- টোকেনগুলো ব্ল্যাকলিস্টে সংরক্ষণ করা যেতে পারে।
সারাংশ:
Token Generation:
- টোকেন তৈরি করার সময়
Header,Payload, এবংSignatureসঠিকভাবে সংজ্ঞায়িত করুন।
Token Validation:
- টোকেনের বৈধতা এবং মেয়াদ যাচাই করুন।
Token Expiration Management:
- স্বল্পমেয়াদী টোকেন ব্যবহার করুন এবং প্রয়োজন হলে রিফ্রেশ টোকেন ইস্যু করুন।
Spring Security এর মাধ্যমে Token Based Authentication সহজেই সুরক্ষিত এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করা যায়।
Read more